www.gusucode.com > Augsburg Biosignal Toolbox源码程序 > matlab代做 修改 程序Augsburg Biosignal Toolbox/程序与说明/程序与说明/数据/Augsburg大学原始数据及说明/matlab/func/aubt_extractFeatECG.m

    function [featvec, featnames] = aubt_extractFeatECG (data, hz)
% Extracts features from a ecg signal.
%
%  values = aubt_extractFeatECG (data, hz)
%
%   input:
%   data:       vector with signal values
%   hz:         sample rate
%
%   output:
%   featvec:    row vector with feature values
%   featnames:  cell array with feature names
%
%   2006, Johannes Wagner <johannes.wagner@informatik.uni-augsburg.de>

%%%%%%%%%%%%%%%%%%%%%
%%% PREPROCESSING %%%
%%%%%%%%%%%%%%%%%%%%%

% calculate pqrst complex
rind = aubt_detecR (data, hz);
[pind, qind, sind, tind] = aubt_detecPQST (data, hz, rind);

% convert rr intervals to heart rate
hz_hrv = hz;
rrintervals = diff (double (rind)) ./ hz;
hrv = 60./rrintervals;  % beats per minute

%%%%%%%%%%%%%%%%
%%% FEATURES %%%
%%%%%%%%%%%%%%%%

k = 1;

rdst = diff (rind);
pdst = diff (pind);
qdst = diff (qind);
sdst = diff (sind);
tdst = diff (tind);
ptmean = zeros (length (pind), 1);
for i = 1:length (pind)
    ptmean(i) = mean (data(pind(i):tind(i)));
end

featvec(k) = mean (rdst) * (1000 / hz);
featnames{k} = 'ecgR-mean';
k = k + 1;
featvec(k) = median (rdst) * (1000 / hz);
featnames{k} = 'ecgR-median';
k = k + 1;
featvec(k) = std (double (rdst)) * (1000 / hz);
featnames{k} = 'ecgR-std';
k = k + 1;
featvec (k) = min (rdst); 
featnames{k} = 'ecgR-min';
k = k + 1;
featvec (k) = max (rdst); 
featnames{k} = 'ecgR-max';
k = k + 1;
featvec (k) = featvec(k-1) - featvec(k-2); 
featnames{k} = 'ecgR-range';
k = k + 1;

featvec(k) = mean (pdst) * (1000 / hz);
featnames{k} = 'ecgP-mean';
k = k + 1;
featvec(k) = median (pdst) * (1000 / hz);
featnames{k} = 'ecgP-median';
k = k + 1;
featvec(k) = std (double (pdst)) * (1000 / hz);
featnames{k} = 'ecgP-std';
k = k + 1;
featvec (k) = min (pdst); 
featnames{k} = 'ecgP-min';
k = k + 1;
featvec (k) = max (pdst); 
featnames{k} = 'ecgP-max';
k = k + 1;
featvec (k) = featvec(k-1) - featvec(k-2); 
featnames{k} = 'ecgP-range';
k = k + 1;

featvec(k) = mean (qdst) * (1000 / hz);
featnames{k} = 'ecgQ-mean';
k = k + 1;
featvec(k) = median (qdst) * (1000 / hz);
featnames{k} = 'ecgQ-median';
k = k + 1;
featvec(k) = std (double (qdst)) * (1000 / hz);
featnames{k} = 'ecgQ-std';
k = k + 1;
featvec (k) = min (qdst); 
featnames{k} = 'ecgQ-min';
k = k + 1;
featvec (k) = max (qdst); 
featnames{k} = 'ecgQ-max';
k = k + 1;
featvec (k) = featvec(k-1) - featvec(k-2); 
featnames{k} = 'ecgQ-range';
k = k + 1;

featvec(k) = mean (sdst) * (1000 / hz);
featnames{k} = 'ecgS-mean';
k = k + 1;
featvec(k) = median (sdst) * (1000 / hz);
featnames{k} = 'ecgS-median';
k = k + 1;
featvec(k) = std (double (sdst)) * (1000 / hz);
featnames{k} = 'ecgS-std';
k = k + 1;
featvec (k) = min (sdst); 
featnames{k} = 'ecgS-min';
k = k + 1;
featvec (k) = max (sdst); 
featnames{k} = 'ecgS-max';
k = k + 1;
featvec (k) = featvec(k-1) - featvec(k-2); 
featnames{k} = 'ecgS-range';
k = k + 1;

featvec(k) = mean (tdst) * (1000 / hz);
featnames{k} = 'ecgT-mean';
k = k + 1;
featvec(k) = median (tdst) * (1000 / hz);
featnames{k} = 'ecgT-median';
k = k + 1;
featvec(k) = std (double (tdst)) * (1000 / hz);
featnames{k} = 'ecgT-std';
k = k + 1;
featvec (k) = min (tdst); 
featnames{k} = 'ecgT-min';
k = k + 1;
featvec (k) = max (tdst); 
featnames{k} = 'ecgT-max';
k = k + 1;
featvec (k) = featvec(k-1) - featvec(k-2); 
featnames{k} = 'ecgT-range';
k = k + 1;

pqdst = qind - pind;
featvec(k) = mean (pqdst) * (1000 / hz);
featnames{k} = 'ecgPQ-mean';
k = k + 1;
featvec(k) = median (pqdst) * (1000 / hz);
featnames{k} = 'ecgPQ-median';
k = k + 1;
featvec(k) = std (double (pqdst)) * (1000 / hz);
featnames{k} = 'ecgPQ-std';
k = k + 1;
featvec (k) = min (pqdst); 
featnames{k} = 'ecgPQ-min';
k = k + 1;
featvec (k) = max (pqdst); 
featnames{k} = 'ecgPQ-max';
k = k + 1;
featvec (k) = featvec(k-1) - featvec(k-2); 
featnames{k} = 'ecgPQ-range';
k = k + 1;
clear pqdst;

qsdst = sind - qind;
featvec(k) = mean (qsdst) * (1000 / hz);
featnames{k} = 'ecgQS-mean';
k = k + 1;
featvec(k) = median (qsdst) * (1000 / hz);
featnames{k} = 'ecgQS-median';
k = k + 1;
featvec(k) = std (double (qsdst)) * (1000 / hz);
featnames{k} = 'ecgQS-std';
k = k + 1;
featvec (k) = min (qsdst); 
featnames{k} = 'ecgQS-min';
k = k + 1;
featvec (k) = max (qsdst); 
featnames{k} = 'ecgQS-max';
k = k + 1;
featvec (k) = featvec(k-1) - featvec(k-2); 
featnames{k} = 'ecgQS-range';
k = k + 1;
clear qsdst;

stdst = tind - sind;
featvec(k) = mean (stdst) * (1000 / hz);
featnames{k} = 'ecgST-mean';
k = k + 1;
featvec(k) = median (stdst) * (1000 / hz);
featnames{k} = 'ecgST-median';
k = k + 1;
featvec(k) = std (double (stdst)) * (1000 / hz);
featnames{k} = 'ecgST-std';
k = k + 1;
featvec (k) = min (stdst); 
featnames{k} = 'ecgST-min';
k = k + 1;
featvec (k) = max (stdst); 
featnames{k} = 'ecgST-max';
k = k + 1;
featvec (k) = featvec(k-1) - featvec(k-2); 
featnames{k} = 'ecgST-range';
k = k + 1;
clear stdst;

pampl = data(pind) - ptmean;
featvec(k) = mean (pampl);
featnames{k} = 'ecgPampl-mean';
k = k + 1;
featvec(k) = median (pampl);
featnames{k} = 'ecgPampl-median';
k = k + 1;
featvec(k) = std (double (pampl));
featnames{k} = 'ecgPampl-std';
k = k + 1;
featvec (k) = min (pampl); 
featnames{k} = 'ecgPampl-min';
k = k + 1;
featvec (k) = max (pampl); 
featnames{k} = 'ecgPampl-max';
k = k + 1;
featvec (k) = featvec(k-1) - featvec(k-2); 
featnames{k} = 'ecgPampl-range';
k = k + 1;
clear pampl;

rampl = data(rind(2:length(rind)-1)) - ptmean;
featvec(k) = mean (rampl);
featnames{k} = 'ecgRampl-mean';
k = k + 1;
featvec(k) = median (rampl);
featnames{k} = 'ecgRampl-median';
k = k + 1;
featvec(k) = std (double (rampl));
featnames{k} = 'ecgRampl-std';
k = k + 1;
featvec (k) = min (rampl); 
featnames{k} = 'ecgRampl-min';
k = k + 1;
featvec (k) = max (rampl); 
featnames{k} = 'ecgRampl-max';
k = k + 1;
featvec (k) = featvec(k-1) - featvec(k-2); 
featnames{k} = 'ecgRampl-range';
k = k + 1;
clear rampl;

sampl = data(sind) - ptmean;
featvec(k) = mean (sampl);
featnames{k} = 'ecgSampl-mean';
k = k + 1;
featvec(k) = median (sampl);
featnames{k} = 'ecgSampl-median';
k = k + 1;
featvec(k) = std (double (sampl));
featnames{k} = 'ecgSampl-std';
k = k + 1;
featvec (k) = min (sampl); 
featnames{k} = 'ecgSampl-min';
k = k + 1;
featvec (k) = max (sampl); 
featnames{k} = 'ecgSampl-max';
k = k + 1;
featvec (k) = featvec(k-1) - featvec(k-2); 
featnames{k} = 'ecgSampl-range';
k = k + 1;
clear sampl;

% hrv features

rr = diff (rind);

featvec(k) = mean (rr);
featnames{k} = 'ecgHrv-mean';
k = k + 1;
featvec(k) = median (rr);
featnames{k} = 'ecgHrv-median';
k = k + 1;
featvec(k) = std (double (rr));
featnames{k} = 'ecgHrv-std';
k = k + 1;
featvec (k) = min (rr); 
featnames{k} = 'ecgHrv-min';
k = k + 1;
featvec (k) = max (rr); 
featnames{k} = 'ecgHrv-max';
k = k + 1;
featvec (k) = featvec(k-1) - featvec(k-2); 
featnames{k} = 'ecgHrv-range';
k = k + 1;
featvec(k) = aubt_pNN50 (rr, hz);
featnames{k} = 'ecgHrv-pNN50';
k = k + 1;

distr = aubt_NNdistr (hrv, 30);

featvec(k) = mean (distr);
featnames{k} = 'ecgHrvDistr-mean';
k = k + 1;
featvec(k) = median (distr);
featnames{k} = 'ecgHrvDistr-median';
k = k + 1;
featvec(k) = std (double (distr));
featnames{k} = 'ecgHrvDistr-std';
k = k + 1;
featvec (k) = min (distr); 
featnames{k} = 'ecgHrvDistr-min';
k = k + 1;
featvec (k) = max (distr); 
featnames{k} = 'ecgHrvDistr-max';
k = k + 1;
featvec (k) = featvec(k-1) - featvec(k-2); 
featnames{k} = 'ecgHrvDistr-range';
k = k + 1;
featvec(k) = aubt_HRVtriind (distr);
featnames{k} = 'ecgHrvDistr-triind';
k = k + 1;

featvec (k) = aubt_getSpecRange (hrv, hz_hrv, 0.0, 0.2);
featnames{k} = 'ecgHrv-specRange1';
k = k + 1;
featvec (k) = aubt_getSpecRange (hrv, hz_hrv, 0.2, 0.4);
featnames{k} = 'ecgHrv-specRange2';
k = k + 1;
featvec (k) = aubt_getSpecRange (hrv, hz_hrv, 0.4, 0.6);
featnames{k} = 'ecgHrv-specRange3';
k = k + 1;
featvec (k) = aubt_getSpecRange (hrv, hz_hrv, 0.6, 0.8);
featnames{k} = 'ecgHrv-specRange4';